﻿using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Devonline.Core;
using Devonline.Entity;
using Microsoft.EntityFrameworkCore.Metadata.Internal;

namespace Devonline.Identity
{
    /// <summary>
    /// 机密, 密钥容器, 字符串类型的默认实现
    /// </summary>
    [Table("secret"), DisplayName("密钥")]
    public class Secret : Secret<string>
    {
    }

    /// <summary>
    /// 机密, 密钥容器
    /// 适用于 AssignType 为: User, Role, Group, Level 的情况下, 保存对应的密钥
    /// 其余 AssignType 类型不适用
    /// 当 AssignType != User 时, 角色, 组织和级别的 SecretKey 将同时由其所有用户公钥加密保存一份, 以便于用户可以使用自己的私钥, 解密并获取所属角色, 组织和级别的数据
    /// 此时只保存所属角色, 组织和级别的 SecretKey 由当前用户公钥加密的密文
    /// 特权用户由所有用户 SecretKey 的密钥备份, 以便于特权用户可以在用户忘记密码时帮助用户恢复数据
    /// </summary>
    /// <typeparam name="TKey"></typeparam>
    [Table("secret"), DisplayName("密钥")]
    public class Secret<TKey> : EntitySetWithCreateAndUpdate<TKey> where TKey : IConvertible
    {
        /// <summary>
        /// 密钥所有者编号
        /// </summary>
        [Column("owner_id"), DisplayName("密钥所有者编号"), Required, MaxLength(36)]
        public virtual TKey OwnerId { get; set; }
        /// <summary>
        /// 密钥所属类型 AssignType 枚举值
        /// </summary>
        [Column("assign_type", TypeName = "VARCHAR(16)"), DisplayName("密钥所属类型"), DefaultValue(AssignType.User)]
        public virtual AssignType AssignType { get; set; }
        /// <summary>
        /// 字符编码算法
        /// </summary>
        [Column("character_encoding_algorithm", TypeName = "VARCHAR(16)"), DisplayName("字符编码算法"), DefaultValue(EncryptionAlgorithm.Base64)]
        public virtual EncryptionAlgorithm CharacterEncodingAlgorithm { get; set; }
        /// <summary>
        /// 哈希算法
        /// </summary>
        [Column("hash_algorithm", TypeName = "VARCHAR(16)"), DisplayName("哈希算法"), DefaultValue(ValidationAlgorithm.HMACSHA256)]
        public virtual ValidationAlgorithm HashAlgorithm { get; set; }
        /// <summary>
        /// 对称加密算法
        /// </summary>
        [Column("symmetric_algorithm", TypeName = "VARCHAR(16)"), DisplayName("对称加密算法"), DefaultValue(SymmetricAlgorithm.AES_256_CBC)]
        public virtual SymmetricAlgorithm SymmetricAlgorithm { get; set; }
        /// <summary>
        /// 非对称加密算法
        /// </summary>
        [Column("asymmetric_algorithm", TypeName = "VARCHAR(16)"), DisplayName("非对称加密算法"), DefaultValue(EncryptionAlgorithm.RSA)]
        public virtual EncryptionAlgorithm AsymmetricAlgorithm { get; set; }
        /// <summary>
        /// 非对称密钥长度, 默认 2048 位
        /// </summary>
        [Column("asymmetric_secret_length"), DisplayName("非对称密钥长度"), DefaultValue(2048)]
        public virtual int AsymmetricSecretLength { get; set; }
        /// <summary>
        /// 哈希值, 保存为明文, 用户密钥的明文签名, 用于校验用户密钥解密后的正确性
        /// </summary>
        [Column("hash_code"), DisplayName("哈希值"), MaxLength(32)]
        public virtual byte[] HashCode { get; set; }
        /// <summary>
        /// 对称算法密钥, 此密钥是加密用户数据的关键密钥, 保存为密文, 由用户公钥加密, 用户私钥解密
        /// </summary>
        [Column("secret_key"), DisplayName("密钥"), MaxLength(256)]
        public virtual byte[] SecretKey { get; set; }
        /// <summary>
        /// 非对称算法公钥, 用于加密用户密钥, 保存为明文, 密钥长度 2048 位, 256 字节
        /// </summary>
        [Column("public_key"), DisplayName("公钥"), MaxLength(256)]
        public virtual byte[] PublicKey { get; set; }
        /// <summary>
        /// 非对称算法私钥, 用于取得用户授权后, 解密用户密钥, 保存为密文, 由用户自有密码加密
        /// </summary>
        [Column("private_key"), DisplayName("私钥"), MaxLength(512)]
        public virtual byte[] PrivateKey { get; set; }
        /// <summary>
        /// 预留的校验信息, 用于重置用户密码时, 校验客户身份, 由用户密钥加密保存为密文
        /// </summary>
        [Column("check_information"), DisplayName("校验信息"), MaxLength(256)]
        public virtual string CheckInformation { get; set; }
    }
}
